#include "executor.h"

// 构造函数：默认初始化
Executor::Executor()
    : x_(0), y_(0), heading_('N'), isAccelerated_(false) {
}

// 自定义初始化
void Executor::initialize(int32_t x, int32_t y, char heading) {
    x_ = x;
    y_ = y;
    heading_ = heading;
    isAccelerated_ = false; // 初始化时强制非加速
}

// 单指令执行逻辑
void Executor::executeCommand(char command) {
    // 处理加速状态切换（F指令）
    if (command == 'F') {
        toggleAccel();
        return;
    }

    // 加速/正常状态分支
    if (isAccelerated_) {
        switch (command) {
        case 'M': // 加速前进：2格（一格一格移动）
            moveForward();
            moveForward();
            break;
        case 'L': // 加速左转：先前进1格再转
            moveForward();
            turnLeft();
            break;
        case 'R': // 加速右转：先前进1格再转
            moveForward();
            turnRight();
            break;
        }
    }
    else {
        switch (command) {
        case 'M': // 正常前进：1格
            moveForward();
            break;
        case 'L': // 正常左转：直接转
            turnLeft();
            break;
        case 'R': // 正常右转：直接转
            turnRight();
            break;
        }
    }
}

// 批量指令执行
void Executor::executeCommands(const std::string& commands) {
    for (char cmd : commands) {
        executeCommand(cmd);
    }
}

// 状态查询：返回所有参数（位置+朝向+加速状态）
void Executor::getCurrentState(int32_t& x, int32_t& y, char& heading, bool& isAccelerated) const {
    x = x_;
    y = y_;
    heading = heading_;
    isAccelerated = isAccelerated_;
}

// 左转逻辑（N→W→S→E→N）
void Executor::turnLeft() {
    switch (heading_) {
    case 'N': heading_ = 'W'; break;
    case 'W': heading_ = 'S'; break;
    case 'S': heading_ = 'E'; break;
    case 'E': heading_ = 'N'; break;
    }
}

// 右转逻辑（N→E→S→W→N）
void Executor::turnRight() {
    switch (heading_) {
    case 'N': heading_ = 'E'; break;
    case 'E': heading_ = 'S'; break;
    case 'S': heading_ = 'W'; break;
    case 'W': heading_ = 'N'; break;
    }
}

// 前进1格逻辑（按朝向更新坐标）
void Executor::moveForward() {
    switch (heading_) {
    case 'N': y_++; break;  // NS方向：北为正
    case 'S': y_--; break;  // NS方向：南为负
    case 'E': x_++; break;  // EW方向：东为正
    case 'W': x_--; break;  // EW方向：西为负
    }
}

// 切换加速状态（F指令触发：开→关 / 关→开）
void Executor::toggleAccel() {
    isAccelerated_ = !isAccelerated_;
}